์ž‘์„ฑ: 2026-03-04 04:03:38์ˆ˜์ •: 2026-03-04 04:03:38

๋ฐฑ์—”๋“œ ํ•„์ˆ˜ ๋””์ž์ธ ํŒจํ„ด ๊ฐ€์ด๋“œ: ์˜ˆ์ œ๋กœ ๋ฐฐ์šฐ๋Š” ํšจ์œจ์ ์ธ ์„ค๊ณ„

๋””์ž์ธ ํŒจํ„ด์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค์— ๋Œ€ํ•œ '๊ฒ€์ฆ๋œ ํ•ด๊ฒฐ์ฑ…'์ž…๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋””์ž์ธ ํŒจํ„ด์€ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์„ ๋‚ฎ์ถ”๋Š” ๊ฐ•๋ ฅํ•œ ๋ฌด๊ธฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.


1. ์ƒ์„ฑ ํŒจํ„ด (Creational Patterns)

๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง์„ ์บก์Аํ™”ํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์œ ์—ฐ์„ฑ์„ ๋†’์ด๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

โ‘  ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด (Singleton)

  • ์„ค๋ช…: ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹จ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑํ•˜๊ณ  ์–ด๋””์„œ๋“  ๊ทธ ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • DB ๊ด€๋ จ ์˜ˆ์‹œ: Database Connection Pool (HikariCP). DB ์—ฐ๊ฒฐ์€ ๋น„์šฉ์ด ๋งค์šฐ ํฌ๊ธฐ ๋•Œ๋ฌธ์—, ์ปค๋„ฅ์…˜ ํ’€ ๊ฐ์ฒด๋ฅผ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๋งŒ๋“ค์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์‹œ:
    @Configuration
    public class DbConfig {
        @Bean
        @Primary // ๋‹จ ํ•˜๋‚˜์˜ DataSource๋งŒ ์ƒ์„ฑํ•˜์—ฌ ๊ณต์œ 
        public DataSource dataSource() {
            return new HikariDataSource();
        }
    }

โ‘ก ๋นŒ๋” ํŒจํ„ด (Builder)

  • ์„ค๋ช…: ๋ณต์žกํ•œ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๊ณผ์ •๊ณผ ํ‘œํ˜„ ๋ฐฉ๋ฒ•์„ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • DB ๊ด€๋ จ ์˜ˆ์‹œ: QueryDSL / jOOQ ์ฟผ๋ฆฌ ์ƒ์„ฑ. ๋ณต์žกํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์กฐ๋ฆฝํ•  ๋•Œ ๋นŒ๋” ํŒจํ„ด์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์‹œ:
    // QueryDSL ์˜ˆ์‹œ: ๋นŒ๋” ๋ฐฉ์‹์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์กฐ๋ฆฝ
    List<User> users = queryFactory
        .selectFrom(user)
        .where(user.age.gt(18))
        .orderBy(user.name.asc())
        .fetch();

2. ๊ตฌ์กฐ ํŒจํ„ด (Structural Patterns)

โ‘  ์–ด๋Œ‘ํ„ฐ ํŒจํ„ด (Adapter)

  • ์„ค๋ช…: ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ค‘๊ฐ„์—์„œ ์—ฐ๊ฒฐํ•ด ์ค๋‹ˆ๋‹ค.
  • DB ๊ด€๋ จ ์˜ˆ์‹œ: JDBC (Java Database Connectivity). ์ž๋ฐ”๋Š” ํ•˜๋‚˜์ธ๋ฐ DB๋Š” MySQL, Oracle, PostgreSQL ๋“ฑ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ DB ๋“œ๋ผ์ด๋ฒ„๊ฐ€ JDBC๋ผ๋Š” ํ‘œ์ค€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋งž์ถฐ '์–ด๋Œ‘ํ„ฐ' ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐœ๋ฐœ์ž๋Š” DB๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ๊ฐ™์€ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ‘ก ํ”„๋ก์‹œ ํŒจํ„ด (Proxy)

  • ์„ค๋ช…: ์‹ค์ œ ๊ฐ์ฒด ์ ‘๊ทผ ์ „ํ›„์— ๋กœ์ง์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • DB ๊ด€๋ จ ์˜ˆ์‹œ: JPA ์ง€์—ฐ ๋กœ๋”ฉ (Lazy Loading). ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ , ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ๊นŒ์ง€ '๊ฐ€์งœ ํ”„๋ก์‹œ ๊ฐ์ฒด'๋ฅผ ์„ธ์›Œ๋‘ก๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๋Š” ์ˆœ๊ฐ„ ํ”„๋ก์‹œ๊ฐ€ DB์— ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์›Œ์˜ต๋‹ˆ๋‹ค.

3. ํ–‰์œ„ ํŒจํ„ด (Behavioral Patterns)

โ‘  ์ „๋žต ํŒจํ„ด (Strategy)

  • ์„ค๋ช…: ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋™์ ์œผ๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.
  • DB ๊ด€๋ จ ์˜ˆ์‹œ: ๋‹ค์ค‘ DB ๋ผ์šฐํŒ… (Master/Slave ๋ถ„๊ธฐ). ์„œ๋น„์Šค ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์“ฐ๊ธฐ ์ž‘์—…์€ Master DB๋กœ, ์ฝ๊ธฐ ์ž‘์—…์€ Slave DB๋กœ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜์˜ ์ƒํƒœ์— ๋”ฐ๋ผ DB ์—ฐ๊ฒฐ ์ „๋žต์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์˜ˆ์‹œ:
    public class RoutingDataSource extends AbstractRoutingDataSource {
        @Override
        protected Object determineCurrentLookupKey() {
            // ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜์ด ReadOnly๋ฉด SLAVE, ์•„๋‹ˆ๋ฉด MASTER ๋ฐ˜ํ™˜
            return TransactionSynchronizationManager.isCurrentTransactionReadOnly() 
                   ? "SLAVE" : "MASTER";
        }
    }

4. ๋ฐฑ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด (Architectural Patterns)

๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํŒจํ„ด (Repository Pattern)

  • ์„ค๋ช…: ๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ DB ์ €์žฅ์†Œ ์‚ฌ์ด์˜ ์ค‘์žฌ์ž ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • DB ๊ด€๋ จ ์˜ˆ์‹œ: Spring Data JPA Repository. ์„œ๋น„์Šค ๋ ˆ์ด์–ด์—์„œ๋Š” ์ด ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋ฐ”๋ผ๋ณด๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ์‹ค์ œ MySQL์— ์žˆ๋Š”์ง€ ๋ฉ”๋ชจ๋ฆฌ(H2)์— ์žˆ๋Š”์ง€๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ด์œ : ํ…Œ์ŠคํŠธ ์‹œ์—๋Š” ๊ฐ€์งœ DB(Mock)๋ฅผ ์ฃผ์ž…ํ•˜๊ณ , ์šด์˜ ์‹œ์—๋Š” ์‹ค์ œ DB๋ฅผ ์ฃผ์ž…ํ•˜์—ฌ ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ํ™˜๊ฒฝ์„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. ์š”์•ฝ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ

  1. ํŒจํ„ด์€ ๋ชฉ์ ์ด ์•„๋‹Œ ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค: ์ฝ”๋“œ๋ฅผ ํŒจํ„ด์— ์–ต์ง€๋กœ ๋ผ์›Œ ๋งž์ถ”๋Š” '์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง'์„ ๊ฒฝ๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜: ํŒจํ„ด์„ ์“ฐ๋Š” ์ด์œ ๋Š” ๋‚˜์ค‘์— ์ฝ”๋“œ๋ฅผ ๊ณ ์น˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.
  3. ์Šคํ”„๋ง๊ณผ์˜ ์กฐํ™”: ์ž๋ฐ” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์Šคํ”„๋ง๊ณผ JPA๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ DB ํ†ต์‹ ์„ ํšจ์œจํ™”ํ•˜๋Š”์ง€(Connection Pool, Proxy, Repository ๋“ฑ) ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.